#ifndef HARDWAREEDITORPRESENTER_H
#define HARDWAREEDITORPRESENTER_H

#include <QObject>
#include <QPointer>
#include "common/deviceattributes.h"
#include "model/datamanager.h"
#include "connectingwindow.h"
#include "attributepaneladapter.h"
#include "specificattrpaneladapter.h"

/**
 * @brief HardwareEditorPresenter
 * @details 负责连接硬件模板数据与界面控件的 Presenter，处理属性同步与保存逻辑。
 */
class HardwareEditorPresenter : public QObject
{
    Q_OBJECT
public:
    /**
     * @brief HardwareEditorPresenter::HardwareEditorPresenter
     * @details 构造 Presenter 并绑定基础视图。
     * @param doc 硬件模板数据。
     * @param connView 连接图视图。
     * @param parent Qt 父对象。
     */
    HardwareEditorPresenter(HardwareTemplatePtr doc,
                            ConnectingWindow *connView,
                            QObject *parent = nullptr);

    /**
     * @brief HardwareEditorPresenter::bind
     * @details 连接各项信号槽，完成初始数据同步。
     */
    void bind();

    // 动态挂载/解绑全局属性面板
    /**
     * @brief HardwareEditorPresenter::setAttrView
     * @details 指定全局属性面板以便 Presenter 同步数据。
     * @param attr 属性面板适配器。
     */
    void setAttrView(AttributePanelAdapter *attr);

    /**
     * @brief HardwareEditorPresenter::save
     * @details 将当前模板保存回数据管理器。
     * @param err 若保存失败返回错误信息。
     * @return 保存是否成功。
     */
    bool save(QString *err = nullptr);

    /**
     * @brief HardwareEditorPresenter::selectedRole
     * @details 获取当前选中的设备角色。
     * @return 设备角色。
     */
    DeviceRole selectedRole() const;
    /**
     * @brief HardwareEditorPresenter::setSelectedRole
     * @details 设置当前选中的设备角色。
     * @param r 设备角色。
     */
    void setSelectedRole(DeviceRole r);
    /**
     * @brief HardwareEditorPresenter::setSpecificView
     * @details 指定特有属性面板适配器。
     * @param spec 适配器指针。
     */
    void setSpecificView(SpecificAttrPanelAdapter *spec);

private slots:
    /**
     * @brief HardwareEditorPresenter::onNodeToggled
     * @details 响应节点选择变化，更新属性面板状态。
     * @param role 节点角色。
     * @param checked 是否选中。
     */
    void onNodeToggled(DeviceRole role, bool checked);
    // 特有属性写回 Model
    /**
     * @brief HardwareEditorPresenter::onSpecificEdited
     * @details 处理特有属性修改并写回模型。
     * @param role 设备角色。
     * @param key 属性键。
     * @param v 属性值。
     */
    void onSpecificEdited(DeviceRole role, const QString &key, const QVariant &v);
    /**
     * @brief HardwareEditorPresenter::onNodeModelSync
     * @details 当节点模型列表更新时同步界面。
     * @param models 可选型号列表。
     * @param currentText 当前选中型号。
     */
    void onNodeModelSync(const QStringList &models, const QString &currentText);

    /**
     * @brief HardwareEditorPresenter::onModelEdited
     * @details 处理型号编辑事件。
     * @param model 新型号。
     */
    void onModelEdited(const QString &model);
    /**
     * @brief HardwareEditorPresenter::onInterfaceEdited
     * @details 处理接口类型编辑。
     * @param idx 接口索引。
     */
    void onInterfaceEdited(int idx);
    /**
     * @brief HardwareEditorPresenter::onAddressEdited
     * @details 处理地址编辑。
     * @param addr 地址文本。
     */
    void onAddressEdited(const QString &addr);

private:
    /**
     * @brief HardwareEditorPresenter::refreshAttrPanel
     * @details 根据当前角色刷新公共属性面板。
     */
    void refreshAttrPanel();

    /**
     * @brief HardwareEditorPresenter::currentModel
     * @details 获取当前模型名称。
     * @return 模型名称。
     */
    QString currentModel() const;
    /**
     * @brief HardwareEditorPresenter::currentIfIndex
     * @details 获取当前接口索引。
     * @return 接口索引。
     */
    int currentIfIndex() const;
    /**
     * @brief HardwareEditorPresenter::currentAddress
     * @details 获取当前设备地址。
     * @return 地址字符串。
     */
    QString currentAddress() const;

    /**
     * @brief HardwareEditorPresenter::getConfig
     * @details 根据角色获取设备配置。
     * @param role 设备角色。
     * @return 配置指针。
     */
    DeviceConfigBasePtr getConfig(DeviceRole role) const;

private:
    HardwareTemplatePtr doc_;
    QPointer<ConnectingWindow> conn_;
    QPointer<AttributePanelAdapter> attr_ {nullptr};
    QPointer<SpecificAttrPanelAdapter> spec_ {nullptr};
    DeviceRole selectedRole_ {DeviceRole::Undefined};
};

#endif // HARDWAREEDITORPRESENTER_H
